package han.chensing.latos.maker.latos.file.transform.impl.melody;

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import han.chensing.latos.common.level.LatosProject;
import han.chensing.latos.common.level.content.LevelData;
import han.chensing.latos.common.level.content.objects.CommonLine;
import han.chensing.latos.common.level.content.objects.CommonNote;
import han.chensing.latos.common.level.meta.LatosMetaData;
import han.chensing.latos.common.level.util.StreamUtil;
@SuppressWarnings({"unchecked", "SpellCheckingInspection"})
public class MelodyParser {
    /**
     *                                                                 1111111111111111111111111111111111111
     *                                                                   .1111111111111111111166.17666511.
     *                                                                      .111111111111111166       .66
     *                                                                           .111111111166777756    66
     *                                                                ..1111111..          56777777776   66
     *                                                      256666665721........13756668888867777777775   66112211.                           38.87
     *                  .............                 266667.......................18 .. .  857777777776    366.  .222             1666666   65  .38111111.
     *             .................111111.      .6666.............................8..   .. 8778888888675888888668888888886 .8831.588 58888888888887188888882
     *         .................111111111111115667.....6.................7.162..13.8. ...687587.. .   88 .  .. 187  .. . .1882 . .. .38  .....6  .787  .. ...
     *       ...............111111111111111666.......73.................7671......6.87..    87  ..68588. .782  287.. 58. . 883 . 5.   8..  .886. .75.. 388  .
     *    ..................111111111111665    .....6.............76.67....71......888887....7.. .88868 ... .88857 ..88  ..8 ...86. ..8 ...8 36.  75.. 588..
     *   ...................111111111766       ...27.............2623.......6......8 . ..  .88. ...  .88.   ... 87.  88.   82.  . ..  8.   8 36  .781  ..  ..
     * ....................11111111565   27651...23............6..6 5........6....1832. 1288366882 128867851 1388527888223587833382222812378 3622787.861 1386
     * ...................1111111567      6.....3662..............5  6.......66.....22.......2677777761...165166            6    .5            672      .  22
     * ..................111111365   .5 31 .....6................3.  71......5 6.....62.......157777773.....666              .7    6         562  2
     * .................11111166.   6  5 ......31................6    5....1.6 13....67........55577761......6                      6     7662   2
     * ...............111111561...25..5.......66................36. 56663.   .36667..6 6........676777561...5                    25  66666  ...      .  .  .
     * .............111111166....32..32......6 5...............16 66.    .566667  .665  6.......677777777766.                      71.6 .2     1.         .
     * ..........11111111166....23...6......6  7...............6361    6   777777761 66  6......677777777751                         65    2    1.          .
     * .......1111111111165.....6...5......6   6..............6 5     7     777777776 66  5.....67777777752                           63    2    .1       .22
     * ...1111111111111166.....5....5.....6    6.............6       6      7777777776 66 21....6777777753                            56           1   2121..
     * 111111111111111176......6...22....6     13..........37        63   566665777776     6....677777773                             26         1  221......
     * 111111111111111166......7...7....31      6.........6          67777666665777776      7..525755567                              76          2.2.....  .
     * 111111111111111162......3...5....6    66666......6.           25777777777777777      6.13.6    7                               66           12........
     * 111111111111111261......5...5...67 565    .56666               777777777777761       .63..26125                               66             22.......
     * 111111111111111261......6...53.26 66       76                    6577777756.11111111131...1713                              563              ..1......
     * 111111111111111162......61.6.6.6666                                       111111111116.....62                             567                 2....  .
     * .11111111111111165.....66617.1615                                        .111111111116....3.                           16363                 22.......
     *   1111111111111166....76266...712                                          11111111 31...5                          .62...36                 2........
     *     111111111111163...6356.....12                           17666573235             6...6                         666267...63              ..2........
     *       11111111111761.66165.....12  .1111             1667222222222222226           6..16                      .62...63 66..67             22 ......
     *          1111111112666776....6..5111111111.      563222222222222222222225        23..71                     663.....66  .6565          122............
     *              111111166761..27...6111111111       622222222222222222222226       6..5                     665 .63....66    665        1 22 ............
     *                     .66...22...6.6111111         132222222222222222222226     73..6                   61.62   161...65            22 11 .21...........
     *                    165....5...6...6               62222222222222222222272    6...3.                62...26     66..66          ..11 21 1.12  ......  .
     *                   66.....6...17....27              352222222222222222221   33...66               66.....66     67.66        1. . .22.121.11...........
     *                  66.....13...6....37.35              262222222222222.     33.6556.      37.    26267...16     26567      2122  1  22...2221...........
     *                163.....661...6...66.....57                 ....        .365635556     .6221    66166..163     27      122....31  212....3.2...........
     *                63....26562...6..6665.......565.                    22262 51265557    622222   662 66.56.           3 11.1.. .211  21 ......  ......  .
     *               76....56. 66...7.676363......67.662.3566665566657222226   3. 65556   62222222  .63  6666          12. . .2.....32. 22...................
     *               36...66   .62...6.56 267....1622 66712   632257666666       65555627722222222  661       ..     1122  2 12....123 22....................
     *                66.36.    361....562 .66...26166  6 1   576.    .6      6  6555557222222222215661      2 1    6666666722.....3112......................
     *                 6666      165...26.1..36662667   66 6   5     6         .655555567222222222372266   2 .2.  .66.77.66662.... .......  ......  ....... .
     *                  56666312666566..6612 22. 265 315562 1    6  7.7657765555555555555632222227666225611.1... 666.62766666................................
     *                  66        .66.76667  321 66   .6556. 665657777655555555555555555555565256555556631. .. 2666666666665.........666662..................
     *                 65         ..65 22.1   2.66    655555556667551777655555555555555555555555555555556632  6655555566661........3666666666................
     *                36     76. 765756666.   163     655556   775.   777555555555555555555555555555555555667665555556566........22663.66 6661..... ....... .
     *                16   6  .5          26666.     6555557   676776667755555555555555555555555555555555555665555556566.. .....2366666 366663............. .
     *                 6633  6                6.    .655555677776667777766555555555555555555555555555555555555555556566.......2236556666666667......21.......
     *                 36  13                   35 26555555566565777655555555555555555555555555555555555555565555556662......3.66555555566665.....122 22.2...
     *                  655                       65555555555677677765555555555555555555555555555555555555556555555667 22...2166555555565666.....22.12.12111.
     *                  66                      765555555555677777776555555555555555555555555555555555555555655555556621.221766555555565566 ....311 2 ..122..
     *                  67                     6555555555556777777775555555555555555555555555555555555555556665555555566666665555555565565.....2221221222221.
     *                  66                    65555555555556777777765555555555566555555555555555555555556663.6655555555555555555555565661.....22.22.22122111.
     *                   66                  65555555555666677777765555555663222227655555555555555556663.21 236665555555555555555565566.....12.121.22.22.22..
     *                    .666              155555555563222777777666573222766732222276655555555666632212212211266566555555555556655662.... 322221221222222  .
     *                        36667         2555555566632222656725666655555555555555555555555566652122.22.22.2213665556666666555566321...1222222222222222....
     *                             3666665.   565566666666665555555556666666666.   .6655555666555566672..21 22 22 1566666666666671121122122 22.121.2212......
     *                                22   17662.1      66555666666666666666           655555556655555667 12..2. 21 22.2...21.22 22.32.22.121.22 22.22.......
     *                      2666       322            766555555666666666663              655555555665555666.22.121221....  .221221222122122.22.221221.....  .
     *                    5667766        12221       665555555556666666666                 655555555565555566521.......1123376666666666666666666322..........
     *                  2667777763           .31221 6655555555555566666666                  16555555555555555666666666655555555555555555555556666............
     *                 66777777766.                66555555555555555666666              6     6555555555555555555555555555555555555555555556   .66...........
     *                6677777777766         11   .6655555555555555555566662              6    555555555555555555555555555555555555555555562  62263  ......  .
     *     6666666657667777777777763     .2222. .66555555555555555555555656              .7    655555555555555555555555555555555555555556   522261...........
     *     56.........77777777777766.  122 .211.6655555555555555555555556555              5.   76555555555555555555555555555555555555556  3322276222222212212
     *      65........1777777777777661.2. 21 13665555555555555555555555555553              6    66555555555555555555555555555555555556   6222225612 12 .2 .2.
     *      162........1777777777777652 .1..2166555555555555555555555555555561              5   133655555555555555555555555555555556    6222222661.21.22.1  2
     *      .761........17777777777766.1.....665555555555555555555555555555556.             3.  57. 655555555555555555555555555556    622222222652212212   2
     *    .111561........1777777777776527666655555555555555555555555555555555562            .6672237 165555555555555555555555566    632222222663.22.222  1.1
     *   11111166.........1777777777766555555555555555555555555555555555555555563          73.5222226   765555555555555555667    7622222225662 12..22   .21 1
     * 111111111561.........7777777776555555555555555555555555555555555555555555651.12667.    6222222261      .22321.        2672222226665231.22.22.   21  2
     * 111111111156..........377777765555555555555555555555555555555555555555555256            62222222227663         1566632222222566222221222221   2. . .
     * 11111111111561.........17777765555555555555555555555555555555555555555555.526            6662222222222222222222222222222223661122.22 22..   12 1. 11 2
     * 1111111111116667.........777655555555555555555555555555555555555555555556.5225.           6775222222222222222222222222222662 23 22 121    22 12 .2 .22
     * 11111111111111117666666672.5555555555555555555555555555555555555555555556 622237          27753222222222222222222222222663.121122.      12  2  2212113
     * 1111111111111111111167 65555555555555555555555555555555555555555555555556 6222226        236776222222222222222222222366            12..1....2223333333
     * 11111111111111111111261 6555555555555555555555555555555555555555555555555262222266 16577777776752757322222222222236652121122121. 1  1. 1. 223337733333
     * 11111111111111111111136. 65555555555555555555555555555555555555555555556.626665667677775665657766.   25666666666622. 11 .2  2  2  21 12 22333333333333
     * 1111111111111111111111362 65555555555555555555555555555555555555555555556227631 66665     6777756       1 22 11 11 .2  2  1. .1  1  2. 223311333333213
     * 11111111111111111111111166 76555555555555555555555555555555555555555556622226622767775665777777761       2122 .. .. ......  .  . ...122333332333333323
     * 1111111111111111111111111767 6555555555555555555555555555555555555556 6222222672166777777777777761  .22222222  1  1. .1  2  2  1  22333733333337333333
     * 111111111111111111111111111662 365555555555555555555555555555555566 77222222256 226677777777777562 12 .2. 22 22.22112. 2. 11 .2.2333333733333337333333
     * .....111111111111111111111111566  66555555555555555555566         62 12222222266 .266777777777662 22.2   2 .2212222.2237221121333331333333322333333312
     * ........111111111111111111111111666. 26655555555555566 .666666666662      12222632.2266666666661221    121221221221.22222231333333312333333213322221.2
     * ..........111111111111111111111111136667    135521  5663122112213276.          76212.2 .. 12  11221221221122122222222222222222223333333333222222222222
     *  ...........1111111111111111111111111111756666666665121.22 22 12 1276           651..1. .1 22  22.21 22 12.12.1222222222222222222222222222222222222222
     *   ...........1111111111111111111111111111121  .121 22 12.12..21.32 266          .6111 .2  2...  32.12..21 22 22222212222222122222221222222221222222212
     *     ..........11111111111111111111111111111 222  2211221221221221122166         166  1  ..  22   .22122122122222221.1222221.1222222..222222..222222..2
     *       111......11111111111111111111111111      3221  12222122122122 .266   .266   65        .22     12222222 .2222222222222222222222222222222222222222
     *          111...11111111111111111111111            .22 22         2 2.  65         261  1  .  .2                    22222222222222222222222222222222222
     *              1..111111111111111111                       .232.22.       67         66.  .   . 22                          1222222222222222222222222222
     *            0 0   0 ...111...                                            162         63 .  .    12                                    ..1222..222222. .
     *  10 0      0 0.  0                                                       36         76        2 2                                    .................
     *  1070      070.  0                                                        56         66122 .    12                                ....................
     *                                                                          1166        .6          2.                            .......................
     * ...111...                                                            111111167        66          2                         ..1111.................111
     * ...1112222.  1                                                    111111111126 .7652   67         22                     .....1.111................111
     * ......2.12.222                                                 .11111111111666666666776661         22.                 ...............................
     * ......2.12.222..                                             .1111111111126575777755757765         1.11.            ..................................
     * ..................                                          1111111111111657777777777777662         2.111        .....................................
     * .............     ..                                       111111222222116665555556666663132        .21111     ....      ...............     .........
     * ............      .....                                   112222222222222211111111111111112222222231 221111 .......     ................     .........
     * 老子今天不写代码，老子今天整活 2023/9/13
     */
    Map<String, Object> stringObjectMap;

    public LatosProject parseMelodyChart(File file){
        if (file==null)return null;
        try{
            LatosProject latosProject=new LatosProject();
            String string = StreamUtil.readStringFromFile(file);
            JSONObject jsonObject=new JSONObject(string);
            JSONArray noteArray = jsonObject.getJSONArray("note");
            List<Object> noteList = noteArray.toList();
            stringObjectMap=jsonObject.toMap();
            LatosMetaData latosMetaData = latosProject.getLatosMetaData();
            latosMetaData.setAuthor(findMapValue("meta.creator"));
            latosMetaData.setDefaultBpm(
                    ((JSONObject) jsonObject.getJSONArray("time").get(0)).getFloat("bpm"));
            latosMetaData.setName(findMapValue("meta.song.title"));

            LevelData levelData = latosProject.getLevelData();
            CommonLine commonLine = levelData.getLineObjects().get(0);
            ArrayList<CommonNote> commonNotes = commonLine.getNotes();
            float offset = findMusicOffsetMs(noteList);
            latosMetaData.setOffset(-offset/1000f);
            float bpm = latosMetaData.getDefaultBpm();
            float spb=60f/bpm;
            //spb*[0]+[1]*spb/[2]+offset
            for (Object o : noteList) {
                if (!(o instanceof HashMap))continue;
                HashMap<String,Object> object = (HashMap<String,Object>) o;
                float[] beatArray = toBeatArray("beat", object);
                if (beatArray==null)continue;
                Object columnObject = object.get("column");
                Object xObject = object.get("x");
                float absTime = beatArrayToAbsTime(beatArray, spb, 0);
                if (columnObject!=null) {
                    int column = (int) columnObject;
                    CommonNote commonNote = genNote(CommonNote.NoteType.Tap,absTime,(int) (((float) column - 1.5f) * 350), commonLine);
                    float[] endBeatArray = toBeatArray("endbeat", object);
                    if (endBeatArray != null) {
                        float endAbsTime = beatArrayToAbsTime(endBeatArray, spb, 0);
                        commonNote.setEndTime(endAbsTime);
                        commonNote.setNoteType(CommonNote.NoteType.Hold);
                    }
                    commonNotes.add(commonNote);
                }else if (xObject!=null){
                    Object wObject = object.get("w");
                    Object typeObject = object.get("type");
                    if (wObject==null)continue;
                    int w=(int)wObject;
                    int x=(int)xObject;
                    CommonNote commonNote = genNote(CommonNote.NoteType.Tap,absTime,(x/256f-0.5f)*1920f, commonLine);
                    if (typeObject!=null&&(int)typeObject==4) commonNote.setNoteType(CommonNote.NoteType.Drag);
                    commonNotes.add(commonNote);
                }
            }
            return latosProject;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    private CommonNote genNote(CommonNote.NoteType type, float absTime, float distanceToLineCenter, CommonLine commonLine){
        CommonNote commonNote =new CommonNote();
        commonNote.setNoteType(CommonNote.NoteType.Tap);
        commonNote.setStartTime(absTime);
        commonNote.setDistanceToLineCenter(distanceToLineCenter);
        commonNote.setBindLine(commonLine);
        return commonNote;
    }

    private float beatArrayToAbsTime(float[] beatArray,float spb,float offset){
        return (spb*beatArray[0]+beatArray[1]*spb/beatArray[2])-offset/1000f;
    }

    private float[] toBeatArray(String name, HashMap<String,Object> rootObject){
        try {
            List<Object> objects = (List<Object>) rootObject.get(name);
            float[] floats=new float[3];
            for (int i = 0; i < objects.size(); i++) {
                floats[i]=(int)(Integer)objects.get(i);
            }
            return floats;
        }catch (Exception ignore){}
        return null;
    }

    private long findMusicOffsetMs(List<Object> noteList){
        try {
            for (int i = noteList.size() - 1; i >= 0; i--) {
                Object o = noteList.get(i);
                if (!(o instanceof HashMap)) continue;
                HashMap<String, Object> jsonObject = (HashMap<String, Object>) o;
                return (long) (Integer) (jsonObject.get("offset"));
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return 0;
    }

    private String findMapValue(String path){
        try{
            String[] strings = path.split("\\.");
            Map<String, Object> map= (Map<String, Object>) stringObjectMap.get(strings[0]);
            for (int i = 1; i < strings.length-1; i++) {
                map= (Map<String, Object>) map.get(strings[i]);
            }
            return (String) map.get(strings[strings.length-1]);
        }catch (Exception ignore){
            return null;
        }
    }
}
